package com.adams.action.videoupload;

import java.math.BigInteger;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.List;
import java.util.UUID;

import org.apache.log4j.Logger;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;

import com.adams.core.exception.BusinessException;

public class DataTransformer {
	/**
	 * 日志对象.
	 */
	private static final Logger logger = Logger
			.getLogger(DataTransformer.class);

	public static Document toXml(UploadVideoResource video) {

		SimpleDateFormat formatter1 = new SimpleDateFormat(
				"yyyy-MM-dd HH:mm:ss");
		String id = "";
		String creatDate = video.getCreateTime().substring(0, 10);
		try {
			id = new Long(
					formatter1.parse(video.getCreateTime()).getTime() / 1000)
					.toString();
		} catch (ParseException e) {
			logger.error(e);
		}
		int len = id.length();
		if (len < 16) {
			UUID uuid = UUID.fromString(UUID.randomUUID().toString());
			long mostSigBits = uuid.getMostSignificantBits();
			BigInteger bigInteger;
			if (mostSigBits < 0) {
				byte[] bytes = new byte[9];
				bytes[8] = (byte) (mostSigBits & 0xff);
				bytes[7] = (byte) ((mostSigBits >> 8) & 0xff);
				bytes[6] = (byte) ((mostSigBits >> 16) & 0xff);
				bytes[5] = (byte) ((mostSigBits >> 24) & 0xff);
				bytes[4] = (byte) ((mostSigBits >> 32) & 0xff);
				bytes[3] = (byte) ((mostSigBits >> 40) & 0xff);
				bytes[2] = (byte) ((mostSigBits >> 48) & 0xff);
				bytes[1] = (byte) ((mostSigBits >> 56) & 0xff);
				bytes[0] = (byte) (0);
				bigInteger = new BigInteger(bytes);
			} else {
				bigInteger = BigInteger.valueOf(mostSigBits);
			}
			String uuidStr = bigInteger.toString();
			id += uuidStr.substring(0, 16 - len);
		} else {
			id = id.substring(0, 16);
		}

		Document document = DocumentHelper.createDocument();
		document.setXMLEncoding("UTF-8");

		Element ADI = document.addElement("ADI");

		Element ADI_Metadata = ADI.addElement("Metadata");
		// --------------ams-package---------------------------------------------------
		ADI_Metadata.addElement("AMS").addAttribute("Asset_Class", "package")
				.addAttribute("Asset_ID", "ADAP" + id).addAttribute(
						"Provider_ID", "ADAMS").addAttribute("Creation_Date",
						creatDate).addAttribute("Version_Minor", "")
				.addAttribute("Version_Major", "").addAttribute("Asset_Name",
						video.getName() == null ? "" : video.getName())
				.addAttribute("Product", "MOD").addAttribute("Provider",
						"ADAMS").addAttribute("Verb", "").addAttribute(
						"Description", "");
		// ---------------------------------------------------------------
		ADI_Metadata.addElement("App_Data").addAttribute("App", "MOD")
				.addAttribute("Name", "Metadata_Spec_Version").addAttribute(
						"Value", "CableLabsMOD1.1");
		// ---------------------------------------------------------------
		Element ADI_Asset = ADI.addElement("Asset");
		Element ADI_Asset_Metadata = ADI_Asset.addElement("Metadata");
		// --------------ams-title---------------------------------------------------
		ADI_Asset_Metadata.addElement("AMS").addAttribute("Asset_Class",
				"title").addAttribute("Asset_ID", "VASP" + id).addAttribute(
				"Provider_ID", "ADAMS").addAttribute("Description",
				video.getRemarkk()).addAttribute("Version_Minor", "")
				.addAttribute("Version_Major", "").addAttribute("Asset_Name",
						video.getName()).addAttribute("Product", "MOD")
				.addAttribute("Provider", "ADAMS").addAttribute("Serial_ID",
						video.getId()).addAttribute("Creation_Date", creatDate)
				.addAttribute("Verb", "");

		ADI_Asset_Metadata.addElement("App_Data").addAttribute("App", "MOD")
				.addAttribute("Name", "Title").addAttribute("Value",
						video.getName());

		ADI_Asset_Metadata.addElement("App_Data").addAttribute("App", "MOD")
				.addAttribute("Name", "DirectorName").addAttribute("Value",
						"xxx");

		ADI_Asset_Metadata.addElement("App_Data").addAttribute("App", "BMS")
				.addAttribute("Name", "TitleSearchCode").addAttribute("Value",
						"x");

		ADI_Asset_Metadata.addElement("App_Data").addAttribute("App", "BMS")
				.addAttribute("Name", "SupplyLang").addAttribute("Value",
						"English");

		ADI_Asset_Metadata.addElement("App_Data").addAttribute("App", "BMS")
				.addAttribute("Name", "ProduceDate").addAttribute("Value",
						creatDate);

		ADI_Asset_Metadata.addElement("App_Data").addAttribute("App", "BMS")
				.addAttribute("Name", "ControlLevel")
				.addAttribute("Value", "0");

		ADI_Asset_Metadata.addElement("App_Data").addAttribute("App", "BMS")
				.addAttribute("Name", "DirectorSearchCode").addAttribute(
						"Value", "x");

		ADI_Asset_Metadata.addElement("App_Data").addAttribute("App", "MOD")
				.addAttribute("Name", "VODProvider").addAttribute("Value",
						"adams");

		ADI_Asset_Metadata.addElement("App_Data").addAttribute("App", "BMS")
				.addAttribute("Name", "IsSitcom").addAttribute("Value", "0");

		ADI_Asset_Metadata.addElement("App_Data").addAttribute("App", "BMS")
				.addAttribute("Name", "IsRecommend").addAttribute("Value", "N");

		ADI_Asset_Metadata.addElement("App_Data").addAttribute("App", "BMS")
				.addAttribute("Name", "National").addAttribute("Value", "CN");

		ADI_Asset_Metadata.addElement("App_Data").addAttribute("App", "BMS")
				.addAttribute("Name", "National_FG")
				.addAttribute("Value", "CN");

		ADI_Asset_Metadata.addElement("App_Data").addAttribute("App", "BMS")
				.addAttribute("Name", "NewFlag").addAttribute("Value", "N");

		ADI_Asset_Metadata.addElement("App_Data").addAttribute("App", "MOD")
				.addAttribute("Name", "Suggested_Price").addAttribute("Value",
						"0");

		ADI_Asset_Metadata.addElement("App_Data").addAttribute("App", "MOD")
				.addAttribute("Name", "PositiveTotal").addAttribute("Value",
						"1");

		ADI_Asset_Metadata.addElement("App_Data").addAttribute("App", "MOD")
				.addAttribute("Name", "Audience").addAttribute("Value", "A");
		// -----------------old-------------------------
		ADI_Asset_Metadata.addElement("App_Data").addAttribute("App", "MOD")
				.addAttribute("Name", "Platform").addAttribute("Value", "CiTV");

		ADI_Asset_Metadata.addElement("App_Data").addAttribute("App", "MOD")
				.addAttribute("Name", "AssetSource").addAttribute("Value",
						"MOD");

		ADI_Asset_Metadata.addElement("App_Data").addAttribute("App", "MOD")
				.addAttribute("Name", "ProductId").addAttribute("Value",
						video.getId());

		// -----------------asset
		// movie------------------------------------------------

		Element ADI_Asset_Asset = ADI_Asset.addElement("Asset");
		Element Metadata = ADI_Asset_Asset.addElement("Metadata");

		Metadata.addElement("AMS").addAttribute("Asset_Class", "movie")
				.addAttribute("Asset_ID", "VASC" + id).addAttribute(
						"Provider_ID", "ADAMS").addAttribute("Description",
						video.getName() == null ? "" : video.getName())
				.addAttribute("Version_Minor", "").addAttribute(
						"Version_Major", "").addAttribute("Asset_Name",
						video.getName()).addAttribute("Product", "MOD")
				.addAttribute("Provider", "ADAMS").addAttribute(
						"Creation_Date", creatDate).addAttribute("Verb", "");

		Metadata.addElement("App_Data").addAttribute("App", "MOD")
				.addAttribute("Name", "Run_Time").addAttribute("Value",
						"00:04:22");

		// bug 修复添加高清标识
		Metadata.addElement("App_Data").addAttribute("App", "MOD")
				.addAttribute("Name", "HDContent").addAttribute("Value", "Y");

		Metadata.addElement("App_Data").addAttribute("App", "MOD")
				.addAttribute("Name", "Bit_Rate").addAttribute("Value", "3750");

		Metadata.addElement("App_Data").addAttribute("App", "MOD")
				.addAttribute("Name", "FileFormat").addAttribute("Value",
						"MPEG_2_TRANSPORT");

		Metadata.addElement("App_Data").addAttribute("App", "MOD")
				.addAttribute("Name", "CodeFormat").addAttribute("Value",
						"MPEG-2");

		Metadata.addElement("App_Data").addAttribute("App", "MOD")
				.addAttribute("Name", "Encryption").addAttribute("Value", "N");

		Metadata.addElement("App_Data").addAttribute("App", "MOD")
				.addAttribute("Name", "Chapter").addAttribute("Value", "1");

		// -----------------old --------------------------------------

		Metadata.addElement("App_Data").addAttribute("App", "MOD")
				.addAttribute("Name", "Title").addAttribute("Value",
						video.getName());

		Metadata.addElement("App_Data").addAttribute("App", "MOD")
				.addAttribute("Name", "Made_Mode").addAttribute("Value", "22");

		Metadata.addElement("App_Data").addAttribute("App", "MOD")
				.addAttribute("Name", "Audience").addAttribute("Value", "A");

		Metadata.addElement("App_Data").addAttribute("App", "MOD")
				.addAttribute("Name", "Actors").addAttribute("Value", "");

		Metadata.addElement("App_Data").addAttribute("App", "MOD")
				.addAttribute("Name", "Director").addAttribute("Value", "");

		Metadata.addElement("App_Data").addAttribute("App", "MOD")
				.addAttribute("Name", "Encode_Format")
				.addAttribute("Value", "");

		Metadata.addElement("App_Data").addAttribute("App", "MOD")
				.addAttribute("Name", "Screen_Format")
				.addAttribute("Value", "");
		// --------保留---------------
		Metadata.addElement("App_Data").addAttribute("App", "MOD")
				.addAttribute("Name", "Content_Code").addAttribute("Value", "");

		Metadata.addElement("App_Data").addAttribute("App", "MOD")
				.addAttribute("Name", "ContentId").addAttribute("Value",
						video.getId());

		// ----------------content---------------------------------
		ADI_Asset_Asset.addElement("Content").addAttribute("Value",
				video.getUrl());

		return document;
	}

	@SuppressWarnings("unchecked")
	public static UploadVideoResource toObject(Document doc) {
		UploadVideoResource video = new UploadVideoResource();

		Element ADI = doc.getRootElement();

		List<Element> App_Datas = ADI.element("Asset").element("Asset")
				.element("Metadata").elements("App_Data");

		for (Element element : App_Datas) {
			if ("ContentId".equals(element.attributeValue("Name"))) {
				video.setId(element.attributeValue("Value"));
			} else if ("Content_Code".equals(element.attributeValue("Name"))) {
				video.setCode(element.attributeValue("Value"));
			} else {
				continue;
			}
		}

		return video;
	}

	public static UploadVideoResource toObject(String XML)
			throws BusinessException {
		Document document;
		try {
			document = DocumentHelper.parseText(XML);
		} catch (DocumentException e) {
			throw new BusinessException("xml.parse.exception", e);
		}
		return toObject(document);
	}

}
